package br.org.etec.dotcao.ws;

import java.util.Collections;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

import br.org.etec.dotcao.exception.UserNotLoggedIn;
import br.org.etec.dotcao.model.Animal;
import br.org.etec.dotcao.model.AnimalRepository;
import br.org.etec.dotcao.model.AnimalStatus;
import br.org.etec.dotcao.model.Repository;
import br.org.etec.dotcao.model.RepositoryFactory;
import br.org.etec.dotcao.model.User;
import br.org.etec.dotcao.utils.SessionUtils;

@Path("/animals")
public class AnimalResource {
	
	@POST
	@Path("/save")
	@Produces({MediaType.APPLICATION_JSON})
	@Consumes({MediaType.APPLICATION_JSON})
	public Message save(@Context HttpServletRequest request, Animal animal){
		try {
			if(animal == null){
				return new Message(Message.ERRO, "Dados inválidos para efetivação do cadastro.");
			}
			
			User logged = SessionUtils.logged(request);
			logged.addAnimal(animal);
			logged.update();
			
			return new Message(Message.SUCESSO, "O animal " + animal.getName() + " foi salvo com sucesso.");
		} catch (UserNotLoggedIn e) {
			return new Message(Message.ERRO, "O usuário precisa estar autenticado para poder realizar esta tarefa.");
		} catch (Exception e) {
			e.printStackTrace();
			return new Message(Message.ERRO, "Ocorreu um erro ao salvar o animal. Tente novamente mais tarde.");
		}
	}
	
	@GET
	@Path("/my")
	@Produces({MediaType.APPLICATION_JSON})
	public List<Animal> myAnimals(@Context HttpServletRequest request){
		try {
			User logged = SessionUtils.logged(request);
			
			return logged.getAnimals();
			
		} catch (Exception e) {
			e.printStackTrace();
			return Collections.emptyList();
		}
	}

	@GET
	@Path("/available")
	@Produces({MediaType.APPLICATION_JSON})
	public List<Animal> availableAnimals(){
		AnimalRepository repository = (AnimalRepository) RepositoryFactory.get(Animal.class);
		
		return repository.all(AnimalStatus.ADOPTION_AVAYLABLE);
	}
}
